﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using SistemaCenterQuimPost.Control;


namespace SistemaCenterQuimPost.UI.PostAdministrador
{
    public partial class frmUsuarios : SistemaCenterQuimPost.Plantillas.frmPlantillaHijo
    {
        //---------ATRIBUTOS---------------------------------------------------------
        
        private DataSet2  UsuariosDs;
        private DataSet2TableAdapters.UsuariosTableAdapter  UsuariosDa;

        protected bool refrescarUsuariosDs = true; //La primera vez debe refrescar el UsuarioDataSet
        
        //---------CONSTRUCTORES------------------------------------------------------
        public frmUsuarios()
        {
            InitializeComponent();

            UsuariosDs = new DataSet2();
            UsuariosDa = new DataSet2TableAdapters.UsuariosTableAdapter();

        }
        //---------ESTADOS------------------------------------------------------------
        private void frmUsuarios_Load(object sender, EventArgs e)
        {
            estEsperandoOperacion();
        }

        protected void estEsperandoOperacion()
        {
            System.Windows.Forms.Control[] controlesHabilitados = { this.dgvUsuarios, this.btnAgregar, this.btnEditar, this.btnEliminar };
            System.Windows.Forms.Control[] controlesDeshabilitados = { this.txtNombreUsuario, this.cboTipoUsuario, this.txtContraseña, this.txtContraseñaRe, this.btnProcesar };
            System.Windows.Forms.Control[] controlesVisibles = { };
            System.Windows.Forms.Control[] controlesInvisibles = { this.lblNombreUsuario, this.txtNombreUsuario, this.lblTipoUsuario, this.cboTipoUsuario, this.lblContraseña, this.txtContraseña, this.lblContraseñaRe, this.txtContraseñaRe, lblError };

            habilitarControles(controlesHabilitados);
            deshabilitarControles(controlesDeshabilitados);
            visibleControles(controlesVisibles);
            invisibleControles(controlesInvisibles);

            cargarGrillaUsuarios();

            errorProvider1.Clear();

            dgvUsuarios.Focus();
        }

        protected void estAgregar()
        {

            System.Windows.Forms.Control[] controlesHabilitados = { this.txtNombreUsuario, this.cboTipoUsuario, this.txtContraseña, this.txtContraseñaRe, this.btnAgregar, this.btnProcesar };
            System.Windows.Forms.Control[] controlesDeshabilitados = { this.dgvUsuarios, this.btnEditar, this.btnEliminar };
            System.Windows.Forms.Control[] controlesVisibles = { this.lblNombreUsuario, this.txtNombreUsuario, this.lblTipoUsuario, this.cboTipoUsuario, this.lblContraseña, this.txtContraseña, this.lblContraseñaRe, this.txtContraseñaRe };
            System.Windows.Forms.Control[] controlesInvisibles = { this.lblError };

            habilitarControles(controlesHabilitados);
            deshabilitarControles(controlesDeshabilitados);
            visibleControles(controlesVisibles);
            invisibleControles(controlesInvisibles);

            //Se borran los textBox de ingreso de datos
            this.txtNombreUsuario.Text = "";
            this.txtContraseña.Text = "";
            this.txtContraseñaRe.Text = "";
            this.cboTipoUsuario.SelectedIndex = 0;

            txtNombreUsuario.Focus();
        }

        protected void estEditar()
        {
            //IF NOMBRE USUARIO EN LA FILA ACTUAL ES "ADMIN" SE DEJA COMO ESTA ABAJO
            if (dgvUsuarios.Rows[dgvUsuarios.CurrentRow.Index].Cells[0].Value.ToString() == "ADMIN")
            {
                System.Windows.Forms.Control[] controlesHabilitados = { this.txtContraseña, this.txtContraseñaRe, this.btnEditar, this.btnProcesar };
                System.Windows.Forms.Control[] controlesDeshabilitados = { this.dgvUsuarios, this.txtNombreUsuario, this.cboTipoUsuario, this.btnAgregar, this.btnEliminar };
                System.Windows.Forms.Control[] controlesVisibles = { this.lblNombreUsuario, this.txtNombreUsuario, this.lblTipoUsuario, this.cboTipoUsuario, this.lblContraseña, this.txtContraseña, this.lblContraseñaRe, this.txtContraseñaRe };
                System.Windows.Forms.Control[] controlesInvisibles = { this.lblError };

                habilitarControles(controlesHabilitados);
                deshabilitarControles(controlesDeshabilitados);
                visibleControles(controlesVisibles);
                invisibleControles(controlesInvisibles);

                //CARGAR TXT CON DATOS DE LA FILA ACTUAL.
                cargarTxt();

                txtNombreUsuario.Focus();
            }
            //SINO SE DEJA ASI
            else
            {
                System.Windows.Forms.Control[] controlesHabilitados = { this.txtNombreUsuario, this.cboTipoUsuario, this.txtContraseña, this.txtContraseñaRe, this.btnEditar, this.btnProcesar };
                System.Windows.Forms.Control[] controlesDeshabilitados = { this.dgvUsuarios, this.btnAgregar, this.btnEliminar };
                System.Windows.Forms.Control[] controlesVisibles = { this.lblNombreUsuario, this.txtNombreUsuario, this.lblTipoUsuario, this.cboTipoUsuario, this.lblContraseña, this.txtContraseña, this.lblContraseñaRe, this.txtContraseñaRe };
                System.Windows.Forms.Control[] controlesInvisibles = { this.lblError };


                habilitarControles(controlesHabilitados);
                deshabilitarControles(controlesDeshabilitados);
                visibleControles(controlesVisibles);
                invisibleControles(controlesInvisibles);

                //CARGAR TXT CON DATOS DE LA FILA ACTUAL.
                cargarTxt();
                txtNombreUsuario.Focus();
            }
        }
        
        //---------METODOS VARIOS-----------------------------------------------------
                
        protected void cargarGrillaUsuarios()
        {
            if (!refrescarUsuariosDs)
            {
                //CARGAR GRILLA CON DATOS. USAR DIRECTAMENTE LOS UsuarioDs y UsuarioDa;
                llenar_dg();
            }
            else
            {
                try
                {
                    actualizarUsuariosDs();
                    ///CARGAR GRILLA CON DATOS. USAR DIRECTAMENTE LOS UsuarioDs y UsuarioDa;;
                    llenar_dg();
                }

                catch (IndexOutOfRangeException)
                {
                    //Se informe que no se encontró nada porque el argumento de busqueda esta fuera del rango.
                    MessageBox.Show("Su consulta no ha arrojado resultados.", "INFORME", MessageBoxButtons.OK, MessageBoxIcon.Information);

                    //Si llega a ocurrir algún error grave se cierra el formulario
                    this.Close();
                }
                catch (Exception ex)
                {
                    //Por cualquier otra excepcion se informa el error, en este caso es un error grave.
                    MessageBox.Show("La conexión a la base de datos no fué exitosa./n/n Comuniquese con su desarrollador para solucionar el problema/n/n" + ex.Message, "ERROR GRAVE - ACCESO A BASE DE DATO", MessageBoxButtons.OK, MessageBoxIcon.Error);

                    //Si llega a ocurrir algún error grave se cierra el formulario 
                    this.Close();
                }
            }
        }

        //protected virtual, se redefine en frmUsuarios Central
        protected virtual void actualizarUsuariosDs()
        {
            //ACTUALIZAR EL ATRIBUTO UsuarioDs
            //UsuariosDa.FillByProductos1(...);
            UsuariosDa.FillByVigente (UsuariosDs.Usuarios);
            
            refrescarUsuariosDs = false;

        }

        protected void btnAgregar_Click(object sender, EventArgs e)
        {
            if (btnEditar.Enabled)
            {
                estAgregar();
            }
            else
            {
                estEsperandoOperacion();
            }

        }

        protected void btnEditar_Click(object sender, EventArgs e)
        {
            if (btnAgregar.Enabled)
            {
                estEditar();
            }
            else
            {
                estEsperandoOperacion();
            }
        }

        //protected virtual, se redefine en frmUsuariosCentral
        protected virtual void btnEliminar_Click(object sender, EventArgs e)
        {
            if (formularioValido("eliminar"))
            {

                string nombreUsuarioActual = "";
                //nombreUsuarioActual = NOMBRE USUARIO DE LA FILA ACTUAL;
                nombreUsuarioActual = dgvUsuarios.Rows[dgvUsuarios.CurrentRow.Index].Cells[0].Value.ToString();

                DialogResult result = MessageBox.Show("¿Desea eliminar el usuario: " + nombreUsuarioActual + "?", "CONFIRMACION", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                if (result == DialogResult.Yes)
                {
                    try
                    {

                        //SE ELIMINA EL USUARIO DE LA FILA ACTUAL. ELIMINACION LOGICA
                        UsuariosDa.UpdateQueryNombreyContraseña(dgvUsuarios.Rows[dgvUsuarios.CurrentRow.Index].Cells[0].Value.ToString(), dgvUsuarios.Rows[dgvUsuarios.CurrentRow.Index].Cells[2].Value.ToString());

                        MessageBox.Show("El usuario: " + nombreUsuarioActual + ", fué eliminado con exito.", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        refrescarUsuariosDs = true;

                        estEsperandoOperacion();

                    }

                    catch (IndexOutOfRangeException)
                    {
                        //Se informe que no se encontró nada porque el argumento de busqueda esta fuera del rango.
                        MessageBox.Show("Su consulta no ha arrojado resultados.", "INFORME", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        //Si llega a ocurrir algún error grave se cierra el formulario
                        this.Close();
                    }
                    catch (Exception ex)
                    {
                        //Por cualquier otra excepcion se informa el error, en este caso es un error grave.
                        MessageBox.Show("La conexión a la base de datos no fué exitosa./n/n Comuniquese con su desarrollador para solucionar el problema/n/n" + ex.Message, "ERROR GRAVE - ACCESO A BASE DE DATO", MessageBoxButtons.OK, MessageBoxIcon.Error);

                        //Si llega a ocurrir algún error grave se cierra el formulario 
                        this.Close();
                    }

                }
            }


        }

        protected void btnProcesar_Click(object sender, EventArgs e)
        {
            procesar();

        }

        protected void procesar() //Lo encapsule en un método así se lo puede llamar cuando se presiona Enter sobre los textBox
        {
            if ((!btnEditar.Enabled) & (!btnEliminar.Enabled)) //estado agregar
            {
                if (formularioValido())
                {
                    agregarUsuario();
                }
                else
                {
                    informarExistenciaError();
                }

            }
            else  //estado editar
            {
                if (formularioValido())
                {
                    editarUsuario();
                }
                else
                {
                    informarExistenciaError();
                }
            }
        }

        //protected virtual para que se pueda redefinir en SistemaCenterQuimCentral frmUsuario.
        protected virtual void agregarUsuario()
        {
            DialogResult result = MessageBox.Show("¿Está seguro en ingresar el nuevo usuario?.", "CONFIRMACION INGRESO DE USUARIO", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

            if (result == DialogResult.Yes)
            {
                try
                {
                    //CONSULTA DE INSERT, A LOS DATOS DE TIPO STRING SE LE SACA LOS ESPACIOS BLANCOS AL PRINICIPIO Y FINAL, LUEGO SE CONVIERTE A MAYUSCULA.
                    //adaptadorUsuario.InsertQueryProducto(txtNombreUsuario.Text.Trim().toUpper()),...,...,)
                                      
                    UsuariosDa.InsertQueryUsuarios(txtNombreUsuario.Text.Trim().ToUpper(), cboTipoUsuario.SelectedItem.ToString().ToUpper().Substring(0,1), txtContraseña.Text.Trim().ToUpper(), true);
                    
                    //Se muestra un mje de confirmación.
                    MessageBox.Show("Usuario ingresado con exito!!!", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Information);

                    refrescarUsuariosDs = true; //Se hizo una modificación a la base de datos.

                    estEsperandoOperacion(); //Luego de insertar un usuario se vuelve al estado esperando operación

                }

                catch (IndexOutOfRangeException)
                {
                    //Se informe que no se encontró nada porque el argumento de busqueda esta fuera del rango.
                    MessageBox.Show("Su consulta no ha arrojado resultados.", "INFORME", MessageBoxButtons.OK, MessageBoxIcon.Information);

                    //Si llega a ocurrir algún error en estado agregar
                    estEsperandoOperacion();
                }
                catch (Exception ex)
                {
                    //Por cualquier otra excepcion se informa el error, en este caso es un error grave.
                    MessageBox.Show("La conexión a la base de datos no fué exitosa. /n /n Comuniquese con su desarrollador para solucionar el problema /n /n" + ex.Message, "ERROR GRAVE - ACCESO A BASE DE DATO", MessageBoxButtons.OK, MessageBoxIcon.Error);

                    //Si llega a ocurrir algún error en estado agregar 
                    this.estEsperandoOperacion();
                }

            }
        }

        //protected virtual para que se pueda redefinir en SistemaCenterQuimCentral frmUsuario. 
        protected virtual void editarUsuario()
        {
            DialogResult result = MessageBox.Show("¿Los datos del usuario serán modificados?.", "CONFIRMACION EDICION DE USUARIO", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

            if (result == DialogResult.Yes)
            {
                try
                {
                    //busca el usuario por nombre.

                    UsuariosDa.FillByNombreyContraseña(UsuariosDs.Usuarios, dgvUsuarios.Rows[dgvUsuarios.CurrentRow.Index].Cells[0].Value.ToString(), dgvUsuarios.Rows[dgvUsuarios.CurrentRow.Index].Cells[2].Value.ToString());
                    
                    UsuariosDs.Usuarios[0].nombreUsuario = txtNombreUsuario.Text.Trim().ToUpper();
                    UsuariosDs.Usuarios[0].tipoUsuario = cboTipoUsuario.SelectedItem.ToString().ToUpper().Substring(0, 1);
                    UsuariosDs.Usuarios[0].contraseña = txtContraseña.Text.Trim().ToUpper();

                    UsuariosDa.Update(UsuariosDs.Usuarios);

                    //Se muestra un mje de confirmación.
                    MessageBox.Show("Usuario editado con exito!!!", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Information);


                    refrescarUsuariosDs = true; //Se hizo una modificación a la base de datos.

                    estEsperandoOperacion(); //Luego de editar un usuario se vuelve al estado esperando operación
                }

                catch (IndexOutOfRangeException)
                {
                    //Se informe que no se encontró nada porque el argumento de busqueda esta fuera del rango.
                    MessageBox.Show("Su consulta no ha arrojado resultados.", "INFORME", MessageBoxButtons.OK, MessageBoxIcon.Information);

                    //Si llega a ocurrir algún error en estado editar
                    estEsperandoOperacion();
                }
                catch (Exception ex)
                {
                    //Por cualquier otra excepcion se informa el error, en este caso es un error grave.
                    MessageBox.Show("La conexión a la base de datos no fué exitosa. /n /n Comuniquese con su desarrollador para solucionar el problema /n /n" + ex.Message, "ERROR GRAVE - ACCESO A BASE DE DATO", MessageBoxButtons.OK, MessageBoxIcon.Error);

                    //Si llega a ocurrir algún error en estado editar 
                    this.estEsperandoOperacion();
                }

            }
        }

        protected bool formularioValido()
        {
            validarNombreUsuario(); //valida la longitud y que no exista otro usuario con el mismo nombre.

            validarReingresoContraseña(); //valida que coincida la contraseña y su reingreso

            if (errorProvider1.GetError(txtContraseñaRe)== "")
            {
                validarContraseña(); //valida la longitud.
            }


            if ((errorProvider1.GetError(txtNombreUsuario) == "") && (errorProvider1.GetError(txtContraseña) == "") && (errorProvider1.GetError(txtContraseñaRe) == ""))
            {
                return true;
            }
            else
            {
                return false;
            }
        }


        protected bool formularioValido(string p)
        {
            if (dgvUsuarios.Rows[dgvUsuarios.CurrentRow.Index].Cells[0].Value.ToString() == "ADMIN") //SI EL NOMBRE DE USUARIO SELECCIONADO EN LA FILA ACTUAL ES "ADMIN" 
            {
                errorProvider1.SetError(btnEliminar, "Eliminar: no se puede eliminar el usuario ADMIN \n\n");
                return false;
            }
            else
            {
                errorProvider1.SetError(btnEliminar, "");
                return true;
            }

        }

        

        protected void validarNombreUsuario()
        {
            if (txtNombreUsuario.Text.Trim() == "")
            {
                errorProvider1.SetError(txtNombreUsuario, "Nombre de usuario: el campo se encuentra vacio\n\n");
            }
            else
            {
                if (txtNombreUsuario.Text.ToUpper().Trim() == "ADMIN")
                {
                    errorProvider1.SetError(txtNombreUsuario, "Nombre de usuario: el nombre de usuario no puede ser ADMIN\n\n");
                }
                else
                {
                    errorProvider1.SetError(txtNombreUsuario, new ValidarDatos().validarLongitud("Nombre de usuario:", txtNombreUsuario.Text, 15));

                }

            }
        }

        //Redefinido en central
        protected virtual void validarContraseña()
        {
            if (txtContraseña.Text.Trim() == "")
            {
                errorProvider1.SetError(txtContraseña, "Contraseña: el campo se encuentra vacio\n\n");
            }
            else
            {
                errorProvider1.SetError(txtContraseña, new ValidarDatos().validarLongitud("Contraseña:", txtContraseña.Text, 15));

                if (errorProvider1.GetError(txtContraseña) == "") //si la validacion de longitud en contraseña está bien
                {
                    UsuariosDa.FillByNombreyContraseña(UsuariosDs.Usuarios, txtNombreUsuario.Text.Trim().ToUpper(),txtContraseña.Text.Trim().ToUpper()); //busca si ya no existe otro usuario con la misma contraseña.

                    if (UsuariosDs.Usuarios.Rows.Count > 0)
                    {
                        errorProvider1.SetError(txtNombreUsuario, "Usuario: Nombre de usuario y contraseña existente, intente cambiar la contraseña.");

                    }
                }

            }
        }

        protected void validarReingresoContraseña()
        {
            if (txtContraseñaRe.Text != txtContraseña.Text)
            {
                errorProvider1.SetError(txtContraseñaRe, "Reingreso de Contraseña: las contraseñas no han coincidido\n\n");
            }
            else
            {
                errorProvider1.SetError(txtContraseñaRe, "");
            }
        }

        
        //protected virtual, se redefine en frmUsuarios Central
        protected virtual void llenar_dg()//llena el datagride con los datos de la consulta
        {
            dgvUsuarios.Rows.Clear();

            for (int i = 0; i < UsuariosDs.Usuarios.Rows.Count; i++)
            {
                dgvUsuarios.Rows.Add(UsuariosDs.Usuarios[i].nombreUsuario, UsuariosDs.Usuarios[i].tipoUsuario, UsuariosDs.Usuarios[i].contraseña);
            }
            
        }

        //Se redefine en central
        protected virtual void cargarTxt()//carga los txt con los datos de la fila de datagride seleccionada
        {
            UsuariosDa.FillByNombreyContraseña(UsuariosDs.Usuarios, dgvUsuarios.Rows[dgvUsuarios.CurrentRow.Index].Cells[0].Value.ToString(), dgvUsuarios.Rows[dgvUsuarios.CurrentRow.Index].Cells[2].Value.ToString());
            
            txtNombreUsuario.Text = UsuariosDs.Usuarios[0].nombreUsuario;
            
            if (UsuariosDs.Usuarios[0].tipoUsuario == "A")
            {
                cboTipoUsuario.SelectedIndex = 2;

            }else
            {
                if (UsuariosDs.Usuarios[0].tipoUsuario == "S")
                {
                    cboTipoUsuario.SelectedIndex = 1;
                }else
                {
                    cboTipoUsuario.SelectedIndex = 0;
                }
            }
            
            txtContraseña.Text = UsuariosDs.Usuarios[0].contraseña;

            txtContraseñaRe.Text = txtContraseña.Text;

            refrescarUsuariosDs = true; //Se debe refrescar el UsuarioDs, ya que fue usado para este propósito sólo contiene un usuario. 
        
        }

        protected void presionoEnter(object sender, KeyEventArgs e) //captura el evento KeyDown. En particular cuando se presiona enter.
        {
            if (e.KeyCode == Keys.Enter)
            {
                this.procesar();

            }
        }

    }
}
